#define M_SPI_SUPPORT_NO

#ifdef M_SPI_SUPPORT_NO

#include "m_spi.h"
#include "m_gpio.h"
#include "m_log.h"
#include "m_time.h"
#include "hi_gpio.h"


#define M_SPI_IDX_CSN   HI_GPIO_IDX_5
#define M_SPI_IDX_CK    HI_GPIO_IDX_6
#define M_SPI_IDX_MISO  HI_GPIO_IDX_7
#define M_SPI_IDX_MOSI  HI_GPIO_IDX_8

static unsigned char m_spi_write_read_char(unsigned char val)
{
    unsigned int i;
    int r;
    unsigned char send[9],recv[9];
    m_log_e(M_SPI_H, "write byte: 0x%02x", val);
    for (i = 0; i < 8; i++) {
        *(send + i) = (val & 0x80) ? '1': '0';
        r = m_gpio_set_val(M_SPI_IDX_MOSI, (val & 0x80) ? M_GPIO_HIGH: M_GPIO_LOW);
        if (r != 0) {
            m_log_e(M_SPI_H, "error=0x%02x", r);
            return val;
        }
        val <<= 1;
        r = m_gpio_set_val(M_SPI_IDX_CK, M_GPIO_HIGH);
        if (r != 0) {
            m_log_e(M_SPI_H, "error=0x%02x", r);
            return val;
        }
        *(recv + i) = (m_gpio_get_val(M_SPI_IDX_MISO) & 0x01) ? '1': '0';
        val |= m_gpio_get_val(M_SPI_IDX_MISO) & 0x01;
        r = m_gpio_set_val(M_SPI_IDX_CK, M_GPIO_LOW);
        if (r != 0) {
            m_log_e(M_SPI_H, "error=0x%02x", r);
            return val;
        }
    }
    send[8] = '\0';
    recv[8] = '\0';
    m_log_e(M_SPI_H, "byte send=%s, recv=%s\n", &send, &recv);
    return val;
}

int m_spi_init()
{
    m_gpio_set_dir(M_SPI_IDX_CSN, M_GPIO_OUT);
    m_gpio_set_dir(M_SPI_IDX_CK, M_GPIO_OUT);
    m_gpio_set_dir(M_SPI_IDX_MISO, M_GPIO_IN);
    m_gpio_set_dir(M_SPI_IDX_MOSI, M_GPIO_OUT);

    m_gpio_set_val(M_SPI_IDX_CSN, M_GPIO_LOW);
    m_gpio_set_val(M_SPI_IDX_CK, M_GPIO_LOW);
    m_gpio_set_val(M_SPI_IDX_MOSI, M_GPIO_LOW);

    m_log_e(M_SPI_H, "dir csn ck miso mosi: %d %d %d %d", 
    m_gpio_get_dir(M_SPI_IDX_CSN), m_gpio_get_dir(M_SPI_IDX_CK), m_gpio_get_dir(M_SPI_IDX_MISO), m_gpio_get_dir(M_SPI_IDX_MOSI));
    
    m_log_e(M_SPI_H, "val csn ck miso mosi: %d %d %d %d", 
    m_gpio_get_val(M_SPI_IDX_CSN), m_gpio_get_val(M_SPI_IDX_CK), m_gpio_get_val(M_SPI_IDX_MISO), m_gpio_get_val(M_SPI_IDX_MOSI));
    
    m_gpio_set_val(M_SPI_IDX_CSN, M_GPIO_HIGH);
    m_gpio_set_val(M_SPI_IDX_CK, M_GPIO_HIGH);
    m_gpio_set_val(M_SPI_IDX_MOSI, M_GPIO_HIGH);
    m_log_e(M_SPI_H, "val csn ck miso mosi: %d %d %d %d", 
    m_gpio_get_val(M_SPI_IDX_CSN), m_gpio_get_val(M_SPI_IDX_CK), m_gpio_get_val(M_SPI_IDX_MISO), m_gpio_get_val(M_SPI_IDX_MOSI));
    
    return 0;
}

int m_spi_host_write_read_bak(m_spi_data *data)
{
    m_gpio_set_val(M_SPI_IDX_CSN, M_GPIO_LOW);
    m_spi_write_read_char(*data->sendBuf);
    m_spi_write_read_char(*(data->sendBuf + 1));
    m_gpio_set_val(M_SPI_IDX_CSN, M_GPIO_HIGH);
    return 0;
}

int m_spi_host_write_read(m_spi_data *data)
{
    m_gpio_set_val(M_SPI_IDX_CSN, M_GPIO_LOW);
    for (int i = 0; i < data->recvSize; i++) {
        *(data->recvBuf++) = m_spi_write_read_char(*(data->sendBuf++)) & 0xFF;
    }
    m_gpio_set_val(M_SPI_IDX_CSN, M_GPIO_HIGH);
    return 0;
}

#endif